package com.backup.common.utils;


import lombok.extern.slf4j.Slf4j;
import net.lingala.zip4j.ZipFile;
import net.lingala.zip4j.exception.ZipException;
import net.lingala.zip4j.model.ZipParameters;
import net.lingala.zip4j.model.enums.CompressionLevel;
import net.lingala.zip4j.model.enums.CompressionMethod;
import net.lingala.zip4j.model.enums.EncryptionMethod;
import org.springframework.stereotype.Component;

import java.io.File;
import java.nio.charset.StandardCharsets;
/**
 * @author
 * @Description zip 压缩单文件/多文件
 */
@Slf4j
@Component
public class ZipUtil {

//    public static void main(String[] args) {
//        zip("static/db-backup/20230625", "123456");
//        unzip("static/db-backup/20230625", "123456");
//    }

    public static void zip(String path, String password){
        // 压缩
        //path  文件夹目录
        //password 密码
        try {
            File currentFile = new File( path);
            if(!currentFile.exists()){
                log.error("需要压缩文件夹不存在");
                return;
            }

            File[] files = currentFile.listFiles();
            if(null == files || files.length < 1){
                log.error("没有可以压缩的文件");
                return;
            }

            //设置参数
            ZipParameters parameters = new ZipParameters();
            //设置压缩方式,默认是COMP_DEFLATE
            parameters.setCompressionMethod(CompressionMethod.DEFLATE);
            //设置压缩级别,默认为0（即不压缩）
            parameters.setCompressionLevel(CompressionLevel.NORMAL);
            // 是否密码
            parameters.setEncryptFiles(true);
            // 加密方式
            parameters.setEncryptionMethod(EncryptionMethod.ZIP_STANDARD);
            String fileName = currentFile.getPath() + "/" + currentFile.getName() + ".zip";
            File file = new File(fileName);
            if(file.exists()){
                log.error( fileName+ "已存在！");
            }
            file.delete();//删除已存在的文件
//            file.renameTo(new File(file.getParent() + "/copy-" + file.getName())); //删除已存在的文件 或者改个名字
            ZipFile zipFile = new ZipFile(file);


            // 遍历test文件夹下所有的文件、文件夹，此处可以对文件进行筛选
//            for (File f : files) {
//                if (f.isDirectory()) {
//                    zipFile.addFolder(f, parameters);
//                } else {
//                    zipFile.addFile(f, parameters);
//                }
//            }

            zipFile.setPassword(password.toCharArray());
            zipFile.setCharset(StandardCharsets.UTF_8);
//            List<File> fileList = new ArrayList<>(Arrays.asList(files));  //文件数组转list

            zipFile.createSplitZipFileFromFolder(currentFile, parameters, false, 0L);
        } catch (ZipException e) {
            e.printStackTrace();
            log.error("压缩异常：" + e.getMessage());
        }
    }

    public static void unzip(String path, String password){
        // 解压
        try {
            File currentFile = new File( path);
            String fileName = currentFile.getPath() + "/" + currentFile.getName() + ".zip";
            ZipFile zipFile = new ZipFile(new File(fileName));
            // 编码格式
            zipFile.setCharset(StandardCharsets.UTF_8);
            //密码
            zipFile.setPassword(password.toCharArray());
            zipFile.extractAll(path);

        } catch (ZipException e) {
            e.printStackTrace();
            log.error("解压异常：" + e.getMessage());
        }
    }
}


